﻿/*
 * 
 * Uma operação é composto de uma serie de interações
 * Uma interação e composto de um telegrama de comando e varias reações,
 * como telegrama de resposta, telegrama de mensagem e bytes recebidos sem semantica definida.
 * 
 * A responsabilidade de um ControladorOperacao é de agir entre um thread
 * executando uma operação e a porta serial transmitindo/recebendo os bytes via uma porta serial.
 * 
 */

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO.Ports;
using System.Collections.Concurrent;
using System.Runtime.CompilerServices;

using J_FoundationClasses.Operacao;

namespace J_Controle
{
    internal enum EstadoOperacao
    {
        Desconectado,
        Conectado,
        Processando,
        Encerrado
    }
    internal class ErroOperacao
    {
    }
    internal class ControladorOperacao
    {
        // ================================ 
        //
        // Membros constituindo o estado do controlador
        // Todos os métodos manipulando o estado estão sincronizados com um lock na instância,
        // utilizando um [Attribute]
        //
        private EstadoOperacao Estado;

        internal ConcurrentQueue<EspecInter> Interacoes;
        internal ConcurrentQueue<byte[]> Respostas;
        internal ConcurrentQueue<byte[]> Mensagens;
        internal ConcurrentQueue<ErroOperacao> Erros;

        AutoResetEvent evPronto;

        // ================================================
        //
        // Constructors
        internal ControladorOperacao(AutoResetEvent prmEvPronto)
        {
            evPronto = prmEvPronto;
            Estado = EstadoOperacao.Desconectado;
            Respostas = new ConcurrentQueue<byte[]>();
            Mensagens = new ConcurrentQueue<byte[]>();
            Erros = new ConcurrentQueue<ErroOperacao>();
            Interacoes = new ConcurrentQueue<EspecInter>();
        }

        // ================================================
        //
        // Métodos principais
        [MethodImplAttribute(MethodImplOptions.Synchronized)]
        internal bool Conectar(ConfigHW prmConfig, SerialPort prmPorta)
        {
            return false;
        }

        [MethodImplAttribute(MethodImplOptions.Synchronized)]
        internal void Processar() { }

        [MethodImplAttribute(MethodImplOptions.Synchronized)]
        internal void Encerrar() { }

        // ==================================================
        //
        // Métodos de resposta para eventos/exceções da porta serial
        //
        [MethodImplAttribute(MethodImplOptions.Synchronized)]
        void AposDataRead() { }

        [MethodImplAttribute(MethodImplOptions.Synchronized)]
        void AposErroRx() { }

        [MethodImplAttribute(MethodImplOptions.Synchronized)]
        void AposPinChanged() { }

        [MethodImplAttribute(MethodImplOptions.Synchronized)]
        void AposTimeoutTx() { }

        [MethodImplAttribute(MethodImplOptions.Synchronized)]
        void AposTimeoutRx() { }

        // ===================================================
        //
        // Métodos de iníciar e terminar a operaçaõ


    }
}
